package it.enrico.mangamania.inventario.client;

import it.enrico.mangamania.inventario.client.panel.CaricamentoFumettiPanel;
import it.enrico.mangamania.inventario.client.panel.GestioneMagazzinoPanel;
import it.enrico.mangamania.inventario.client.panel.InserimentoFumettoPanel;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class MangaManiaInventario implements EntryPoint {

	private List<Fumetto> fumettiAll = new ArrayList<Fumetto>();
	public List<Fumetto> getFumettiAll() {
		return fumettiAll;
	}

	public void setFumettiAll(List<Fumetto> fumettiAll) {
		this.fumettiAll = fumettiAll;
	}

	private List<Fumetto> fumettiMostrati = new ArrayList<Fumetto>();
	private List<Fumetto> fumettiFilteredByQty = new ArrayList<Fumetto>();

	private final SalvaFumettoServiceAsync salvaFumettoService = GWT
			.create(SalvaFumettoService.class);

	private FlexTable stocksFlexTable = new FlexTable();

	private CheckBox visualizzaSolo = new CheckBox();

	private Label fumettoLabel = new Label("Fumetto:");
	private Label visualizzaSoloLabel = new Label("Visualizza Solo <= ");
	
	private VerticalPanel visualizzaSoloPanel = new VerticalPanel();
	private Label visualizzaSoloMaggioreUguale = new Label("Visualizza Solo >=");
	private CheckBox visualizzaSoloMaggioreUgualeCheckBox = new CheckBox();
	private VerticalPanel visualizzaSoloCheckBoxPanel = new VerticalPanel();
	
	private VerticalPanel visualizzaSoloMinoreUgualePanel = new VerticalPanel();
	
	

	private TextBox ricercaFumetto = new TextBox();
	private TextBox ricercaNumero = new TextBox();
	private TextBox ricercaNumeroMaggioreUguale = new TextBox();

	private Label labelBarcode = new Label("Barcode:");
	private Label labelEditore = new Label("Editore:");
	private TextBox ricercaBarcode = new TextBox();
	private TextBox ricercaEditore = new TextBox();

	private HorizontalPanel searchPanel1 = new HorizontalPanel();
	private HorizontalPanel searchPanel2 = new HorizontalPanel();
	private HorizontalPanel searchPanel3 = new HorizontalPanel();

	private CheckBox fumettiCheck = new CheckBox("Fumetti");

	private CheckBox gadgetCheck = new CheckBox("Gadget");

	private VerticalPanel mainPanel = new VerticalPanel();

	private VerticalPanel panel1 = new VerticalPanel();
	private GestioneMagazzinoPanel panel2 = new GestioneMagazzinoPanel(this);
	
	private InserimentoFumettoPanel panel3 = new InserimentoFumettoPanel(this);
	
	private CaricamentoFumettiPanel panel4 = new CaricamentoFumettiPanel(this);
	private TabPanel tabPanel1 = new TabPanel();

	private FlowPanel esportaPanel = new FlowPanel();
	private Button esportaVisualizzatoButton = new Button(
			"Esporta inventario visualizzato");
	private Button esportaTuttoButton = new Button("Esporta tutto");

	public void onModuleLoad() {
		
		visualizzaSoloPanel.add(visualizzaSoloLabel);
		visualizzaSoloPanel.add(visualizzaSoloMaggioreUguale);
		visualizzaSoloCheckBoxPanel.add(visualizzaSolo);
		visualizzaSoloCheckBoxPanel.add(visualizzaSoloMaggioreUgualeCheckBox);
		visualizzaSoloMinoreUgualePanel.add(ricercaNumero);
		visualizzaSoloMinoreUgualePanel.add(ricercaNumeroMaggioreUguale);
		
		salvaFumettoService.retireveFumetti(new AsyncCallback<List<Fumetto>>() {

			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub

			}

			public void onSuccess(List<Fumetto> result) {
				fumettiAll = result;

			}
		});

		initComponentsLayout();

		populateTestTable();

		ricercaNumero.setWidth("25");
		ricercaNumero.setText("0");
		
		ricercaNumeroMaggioreUguale.setWidth("25");
		ricercaNumeroMaggioreUguale.setText("0");

		initRicercaFumettoForSearch();
		searchPanel1.add(fumettoLabel);
		searchPanel1.add(ricercaFumetto);
		searchPanel1.add(visualizzaSoloPanel);
		searchPanel1.add(visualizzaSoloCheckBoxPanel);
		searchPanel1.add(visualizzaSoloMinoreUgualePanel);
		

		ricercaBarcode.setEnabled(false);
		initFumettiCheck();
		fumettiCheck.setEnabled(false);
		searchPanel2.add(labelBarcode);
		searchPanel2.add(ricercaBarcode);
		searchPanel2.add(fumettiCheck);

		initGadgetCheckFunctions();
		
		initRicercaEditore();
		
		gadgetCheck.setEnabled(false);
		searchPanel3.add(labelEditore);
		searchPanel3.add(ricercaEditore);
		searchPanel3.add(gadgetCheck);

		// aggiunge i campi di ricerca al pannello verticale
		panel1.add(searchPanel1);
		panel1.add(searchPanel2);
		panel1.add(searchPanel3);

		panel1.add(stocksFlexTable);

		initEsportaPanel(); 

		tabPanel1.add(panel1, "Gestione Inventario");
		tabPanel1.add(panel2, "Gestione Carico/Scarico");
		tabPanel1.add(panel3, "Inserimento Nuovi fumetti");
		tabPanel1.add(panel4, "Caricamento Fumetti");
		
		tabPanel1.selectTab(0);
		tabPanel1.setSize("500px", "250px");
		tabPanel1.addStyleName("table-center");

		initVisualizzaSolo();

		mainPanel.add(tabPanel1);
		
		

		RootPanel.get("mangas").add(mainPanel);
	}

	private void initRicercaEditore() {
		ricercaEditore.addKeyUpHandler(new KeyUpHandler() {
			
			public void onKeyUp(KeyUpEvent event) {
				filterByEditore(ricercaEditore.getText()); 
				
			}
		});
		
	}

	private void initFumettiCheck() {
		fumettiCheck.addValueChangeHandler(new ValueChangeHandler<Boolean>() {

			public void onValueChange(ValueChangeEvent<Boolean> event) {
				if (event.getValue().booleanValue() == true) {
					gadgetCheck.setChecked(false);
					gadgetCheck.setEnabled(false);
					filterByTipo(TipoProdotto.TIPO_FUMETTO);
				} else {
					fumettiCheck.setEnabled(true);
					populateTableBySearchString(ricercaFumetto.getText());
				}

			}
		});

	}

	private void initGadgetCheckFunctions() {
		gadgetCheck.addValueChangeHandler(new ValueChangeHandler<Boolean>() {

			public void onValueChange(ValueChangeEvent<Boolean> event) {
				if (event.getValue().booleanValue() == true) {
					fumettiCheck.setChecked(false);
					fumettiCheck.setEnabled(false);
					filterByTipo(TipoProdotto.TIPO_GADGET);
				} else {
					gadgetCheck.setEnabled(true);
					populateTableBySearchString(ricercaFumetto.getText());
				}
			}
		});

	}

	private void initVisualizzaSolo() {
		fumettiFilteredByQty.clear();
		visualizzaSolo.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
			
			public void onValueChange(ValueChangeEvent<Boolean> event) {
				fumettiFilteredByQty.clear();
				if (event.getValue().equals(Boolean.TRUE)) {
					
					if (ricercaNumero.getText().trim().equals(""))
					{
						Window.alert("Popolare correttamente ");
						return;
					}
					
					List<Fumetto> fumettiBuffer = new ArrayList<Fumetto>();
					for (Fumetto f : fumettiMostrati) {
						if (f.getRimanenti()<= (new Long(ricercaNumero.getText())).longValue())
						{
							fumettiFilteredByQty.add(f);
						}

					}
					populateTable(fumettiFilteredByQty);
				} else
				{
					populateTable(fumettiMostrati);
				}

			}
		});

	}
	
	
	private void initVisualizzaSoloMaggioreUguale() {
		fumettiFilteredByQty.clear();
		visualizzaSoloMaggioreUgualeCheckBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
			
			public void onValueChange(ValueChangeEvent<Boolean> event) {
				fumettiFilteredByQty.clear();
				if (event.getValue().equals(Boolean.TRUE)) {
					
					if (ricercaNumero.getText().trim().equals(""))
					{
						Window.alert("Popolare correttamente ");
						return;
					}
					
					List<Fumetto> fumettiBuffer = new ArrayList<Fumetto>();
					for (Fumetto f : fumettiMostrati) {
						if (f.getRimanenti()>= (new Long(ricercaNumero.getText())).longValue())
						{
							fumettiFilteredByQty.add(f);
						}

					}
					populateTable(fumettiFilteredByQty);
				} else
				{
					populateTable(fumettiMostrati);
				}

			}
		});

	}

	private void filterByTipo(String tipo) {
		List<Fumetto> buffer = new ArrayList<Fumetto>();
		for (Fumetto f : fumettiMostrati) {
			if (f.getCategoria().equals(tipo)) {
				buffer.add(f);
			}
		}
		fumettiMostrati = buffer;
		populateTable(buffer);
	}

	private void populateTable(List<Fumetto> fumetti) {
		stocksFlexTable.removeAllRows();
		populateTestTable(); // inizializza intestazione

		int i = 1;

		for (Fumetto f : fumetti) {
			stocksFlexTable.setText(i, 0, f.getNome());
			stocksFlexTable.setText(i, 1, new Long((f.getQuantitaAcquistata()
					.longValue() - f.getQuantitaVenduta().longValue()))
					.toString());
			stocksFlexTable.setText(i, 2, f.getQuantitaAcquistata().toString());
			stocksFlexTable.setText(i, 3, f.getQuantitaVenduta().toString());
			stocksFlexTable.setText(i, 4, f.getCodice());
			stocksFlexTable.setText(i, 5, f.getEdizioni());
			stocksFlexTable.setText(i, 6, f.getPrezzo().toString());
			i++;

		}

	}

	private void initRicercaFumettoForSearch() {

		ricercaFumetto.addKeyUpHandler(new KeyUpHandler() {

			public void onKeyUp(KeyUpEvent event) {

				stocksFlexTable.removeAllRows();
				fumettiMostrati.clear();
				populateTestTable();
				int i = 1;

				for (Fumetto f : fumettiAll) {

					if (!(ricercaFumetto.getText().trim().equals(""))) {

						if (f.getNome().toLowerCase().contains(
								ricercaFumetto.getText().toLowerCase())) {

							stocksFlexTable.setText(i, 0, f.getNome());
							stocksFlexTable.setText(i, 1, new Long((f
									.getQuantitaAcquistata().longValue() - f
									.getQuantitaVenduta().longValue()))
									.toString());
							stocksFlexTable.setText(i, 2, f
									.getQuantitaAcquistata().toString());
							stocksFlexTable.setText(i, 3, f
									.getQuantitaVenduta().toString());
							stocksFlexTable.setText(i, 4, f.getCodice());
							stocksFlexTable.setText(i, 5, f.getEdizioni());
							stocksFlexTable.setText(i, 6, f.getPrezzo().toString());
							i++;
							fumettiMostrati.add(f);
						}

					}
				}

				if (fumettiMostrati.size() > 0) {
					fumettiCheck.setEnabled(true);
					gadgetCheck.setEnabled(true);
				} else {
					fumettiCheck.setEnabled(false);
					gadgetCheck.setEnabled(false);
				}
			}
		});

	}

	private void initEsportaPanel() {

		esportaPanel.add(esportaVisualizzatoButton);
		esportaPanel.add(esportaTuttoButton);
		panel1.add(esportaPanel);

	}

	private void initComponentsLayout() {
		stocksFlexTable.setBorderWidth(1);

	}

	private void populateTestTable() {
		stocksFlexTable.setText(0, 0, "Nome");
		stocksFlexTable.setText(0, 1, "Rimanenti");
		stocksFlexTable.setText(0, 2, "Acquistati");
		stocksFlexTable.setText(0, 3, "Venduti");
		stocksFlexTable.setText(0, 4, "Codice");
		stocksFlexTable.setText(0, 5, "Editore");
		stocksFlexTable.setText(0, 6, "Prezzo");

	}

	private void populateTableBySearchString(String criterion) {

		stocksFlexTable.removeAllRows();
		fumettiMostrati.clear();
		populateTestTable();
		int i = 1;

		for (Fumetto f : fumettiAll) {

			if (!(criterion.trim().equals(""))) {

				if ((f.getNome().toLowerCase()).contains(criterion.toLowerCase())) {

					stocksFlexTable.setText(i, 0, f.getNome());
					stocksFlexTable.setText(i, 1, new Long((f
							.getQuantitaAcquistata().longValue() - f
							.getQuantitaVenduta().longValue())).toString());
					stocksFlexTable.setText(i, 2, f.getQuantitaAcquistata()
							.toString());
					stocksFlexTable.setText(i, 3, f.getQuantitaVenduta()
							.toString());
					stocksFlexTable.setText(i, 4, f.getCodice());
					stocksFlexTable.setText(i, 5, f.getEdizioni());
					stocksFlexTable.setText(i, 6, f.getPrezzo().toString());
					i++;
					fumettiMostrati.add(f);
				}

			}
		}

		if (fumettiMostrati.size() > 0) {
			fumettiCheck.setEnabled(true);
			gadgetCheck.setEnabled(true);
		} else {
			fumettiCheck.setEnabled(false);
			gadgetCheck.setEnabled(false);
		}

	}
	
	private void filterByEditore(String editFrag)
	{
		List<Fumetto> bufferList = new ArrayList<Fumetto>();
		List<Fumetto> daMostrare = new ArrayList<Fumetto>();
		if (!ricercaFumetto.getText().equals(""))
		{
			bufferList=fumettiMostrati;
		} else
		{
			bufferList=fumettiAll;
		}
		
		for (Fumetto fumetto: bufferList)
		{
			if (fumetto.getEdizioni().toLowerCase().contains(editFrag.toLowerCase()))
			{
				daMostrare.add(fumetto);
			}
			
		}
		
		populateTable(daMostrare);
	}

}